package ar.uba.fi.algo3.modelo;

import java.util.ArrayList;

import fiuba.algo3.titiritero.modelo.ObjetoVivo;

import ar.uba.fi.algo3.auxiliares.*;
import ar.uba.fi.algo3.modelo.astillero.*;
import ar.uba.fi.algo3.modelo.disparo.Disparo;
import ar.uba.fi.algo3.modelo.nave.*;

public class BatallaNaval implements ObjetoVivo {
	
	public CampoBatalla campoBatalla;
	public Jugador jugador;
	private Astillero fabricaDeLanchas, fabricaDeBuques, fabricaDeDestructores, fabricaDePortaAviones, fabricaDeRompeHielos;
	private Disparo disparoElegido;
	public ArrayList<Nave> listaNaves;
	private boolean juegoEmpezo=false;
	
	public BatallaNaval() {
		
		this.jugador= new Jugador();
		this.campoBatalla= new CampoBatalla();
		this.construirNaves();
    }
    
	public void insertarAlCampo(Nave unaPieza) {
       
		this.campoBatalla.insertarAlCampo(unaPieza);	
	}

	public void insertarAlCampo(Disparo unaPieza) {
	       
		this.campoBatalla.insertarAlCampo(unaPieza);	
	}
	
	public void avanzarUnTurno() {
	
		this.campoBatalla.pasoUnTurno();
		jugador.descontarPuntajePorTurno(10);
	}

	public boolean todasLasNavesHundidas() {
		
		if((this.campoBatalla.noHayNaves())&& (juegoEmpezo))   
			
            return true;
            	
        return false;
	}

	public boolean puntosAcabados() {
		
		if ((this.jugador.obtenerPuntaje() <= 0)&& (juegoEmpezo))
			
			return true;
		
		return false;		
	}
	
	public void construirNaves() {

		listaNaves= new ArrayList<Nave>();
		fabricaDeLanchas= new AstilleroDeLanchas();
		fabricaDeBuques= new AstilleroDeBuques();
		fabricaDeDestructores= new AstilleroDeDestructores();
		fabricaDePortaAviones= new AstilleroDePortaAviones();
		fabricaDeRompeHielos= new AstilleroDeRompeHielos();
		
		Nave unaLancha= fabricaDeLanchas.crearNaveEn(new Posicion(7,0),this.campoBatalla , new DireccionDerecha());
		Nave unDestructor= fabricaDeDestructores.crearNaveEn(new Posicion(7,9), this.campoBatalla, new DireccionDerechaInferior());
		Nave unBuque= fabricaDeBuques.crearNaveEn(new Posicion(6,0), this.campoBatalla, new DireccionSuperior());
		Nave unPortaAvion= fabricaDePortaAviones.crearNaveEn(new Posicion(0,8), this.campoBatalla, new DireccionIzquierda());
		Nave unRompeHielos= fabricaDeRompeHielos.crearNaveEn(new Posicion(0,0), this.campoBatalla,new DireccionIzquierdaSuperior());
		Nave unaLancha2= fabricaDeLanchas.crearNaveEn(new Posicion(7,4), this.campoBatalla, new DireccionIzquierdaInferior());
		Nave unDestructor2= fabricaDeDestructores.crearNaveEn(new Posicion(7,8), this.campoBatalla, new DireccionIzquierda());
			
		this.insertarAlCampo(unaLancha);listaNaves.add(unaLancha);
		this.insertarAlCampo(unaLancha2);listaNaves.add(unaLancha2);
		this.insertarAlCampo(unBuque);listaNaves.add(unBuque);
		this.insertarAlCampo(unDestructor);listaNaves.add(unDestructor);
		this.insertarAlCampo(unDestructor2);listaNaves.add(unDestructor2);
		this.insertarAlCampo(unRompeHielos);listaNaves.add(unRompeHielos);
		this.insertarAlCampo(unPortaAvion);listaNaves.add(unPortaAvion);
		
	}

	public ArrayList<Nave> getNaves() {
		
		return this.campoBatalla.getNaves();
	}
	
	public Disparo disparar (int posicionX, int posicionY){	
		
		Disparo disparo= this.disparoElegido.crearDisparo(new Posicion(posicionX,posicionY),this.campoBatalla );
		this.insertarAlCampo(disparo);		
		this.avanzarUnTurno();
		jugador.descontarPuntajePorDisparo(disparo.obtenerCosto());
		this.juegoEmpezo=true;
		return disparo;
	}

	public void guardarDisparo(Disparo disparo) {

		this.disparoElegido= disparo;
	}

	public int getPuntaje() {
		
		return jugador.obtenerPuntaje();
	}

	public CampoBatalla getCampoBatalla() {

		return campoBatalla;
	}

	public ArrayList<Nave> getListaNaves(){
		
		return listaNaves;
	}
	
	public void setJuegoEmpezo(){
		this.juegoEmpezo=true;
	}
	
	public void vivir() {}
}
